/*
 * @Description: 绘图模式下功能模块-点
 * @Date: 2022-01-13 16:47:21
 * @Author: yeming
 */
// transform 将坐标从源投影转换为目标投影。这将返回一个新坐标（并且不会修改原始坐标）。
// fromLonLat 将坐标从经度/纬度转换为不同的投影坐标。 transform(latlng, "EPSG:4326", "EPSG:3857")
// toLonLat 将投影坐标转换为经度/纬度。 transform(coordinate, "EPSG:3857", "EPSG:4326")

import { fromLonLat, toLonLat } from 'ol/proj.js'
import OlGeomPoint from 'ol/geom/Point.js'
// 一个source下含多个Feature。Feature是所有图形的一个封装，具体代表什么图形由内部的geometry参数决定。
import OlFeature from 'ol/Feature'
import { setOlStylePoint, setOlStyleImage } from '../../common/olStyle.js'

const AIRLINE_GIVE_POINT = './static/olcsMap/img/give_point_to_fly.png'
const DEFAULT_POINT_STYLE = { 'fillColor': 'rgba(0, 153, 255, 1)', 'strokeColor': 'rgba(255, 255, 255, 1)', 'strokeWidth': 2, 'text': '' }

class Point3d {
  // 实际操作中发现，传入options对象报错
  constructor(entities, id, type, color, lable, image, clampToGround = false) {
    let that = this
    this.entities = entities
    this.position = null
    this.options = {
      id: id, // 创建和2d点相同sessionId的entity,
      name: 'point3d_' + id,
      type: type,
      color: color,
      show: true,
      position: new Cesium.CallbackProperty(function () { // 实时更新 CallbackProperty 第一个参数为回调函数
        return that.position
      }, false)
    }

    if (image && image !== "") {
      this.options.billboard = {
        image: image,
        scale: 0.5,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM
        // disableDepthTestDistance: Number.POSITIVE_INFINITY // 开启则没有3d效果（如火点在山腰出，移动地图飘）
      }
    } else {
      this.options.billboard = {
        image: new Cesium.PinBuilder().fromText(lable, Cesium.Color.fromCssColorString(color), 35).toDataURL(),
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM
        // disableDepthTestDistance: Number.POSITIVE_INFINITY // 开启则没有3d效果
      }
    }

    // 设置 HeightReference高度参考类型为CLAMP_TO_GROUND贴地类型（贴地之后，不会飘，转动地图会被山体遮挡）
    if (clampToGround) this.options.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND
    this.entity = this.entities.add(this.options)
  }
}

// 通用参数
// 类型 type 0-航线S1（起始）点 1-航线任务航点 2-（降落）航线降高点 3-（降落）航线刹车点 4-（降落）航线降落点 5-吊舱视野点 6-自定义点 7-飞机起飞点 8-指点飞行的点  9-仿真中心点 10-仿真起飞点 11-多边形电子围栏各顶点

class Point {
  constructor(ol2d, vectorSource) {
    this.ol2d = ol2d
    this.vectorSource = vectorSource // 矢量标注的数据源 addFeature(), getFeatures(), removeFeature()
    this.feature = null
  }

  /**
   * @desc: 添加点（最新）
   * @param {Number} id 点id
   * @param {Array} latlng [lon, lat, h]
   * @param {Number} type 点类型 0-起飞点 1-任务航点 2-降高 3-刹车 4-降落
   * @param {Number} num 点编号（索引 + 1）
   * @param {String} prefix 点编号前缀
   * @param {Number} isHover 是否盘旋 根据此参数来决定是否绘制盘旋半径
   * @param {Number} radius 盘旋半径
   * @param {Number} isEdit 是否可编辑
   * @param {Object} style 自定义样式
   * @param {Number} sessionId 父级 hash Map sessionId
   * @param {Number} lineType 父级 hash Map type
   * @return {*}
   * @use: 使用示例
   */
  addPoint (id, latlng, type, num = 1, prefix = '', isHover = 0, radius = 0, isEdit = 0, style = {}, sessionId = 0, lineType = 0, rend3d = false) {
    // 记录点样式
    let customStyle = JSON.stringify(style) == "{}" ? DEFAULT_POINT_STYLE : style
    customStyle.text = prefix + num

    const pointFeature = new OlFeature({
      id: id,
      latlng: latlng,
      type: type,
      index: num - 1,
      prefix: prefix,
      num: prefix + num,
      isHover: isHover,
      radius: radius,
      isEdit: isEdit,
      style: customStyle,
      parentId: sessionId,
      parentType: lineType,
      rend3d: rend3d,
      geometry: new OlGeomPoint(fromLonLat(latlng))
    });
    pointFeature.setStyle(setOlStylePoint(customStyle))

    this.feature = pointFeature
    this.vectorSource.addFeature(pointFeature)
  }

  /**
   * @desc: 添加自定义点
   * @param {Number} id
   * @param {Array} latlng
   * @param {Number} type 自定义点类型 1-精确着火点 2-粗略着火点 3-警察位置 4-消防员位置 5-漫游基站位置
   * @param {String} image
   * @param {Number} radius
   * @param {Number} isEdit
   * @return {*}
   * @use: 使用示例
   */
  addCustomPoint (id, latlng, type, image, radius, isEdit = false, rend3d = false) {
    image = image && image !== '' ? image : AIRLINE_GIVE_POINT

    const feature = new OlFeature({
      id: id,
      latlng: latlng,
      type: 6,
      customType: type,
      image: image,
      radius: radius,
      isEdit: isEdit,
      rend3d: rend3d,
      geometry: new OlGeomPoint(fromLonLat(latlng))
    });
    this.feature = feature
    feature.setStyle(setOlStyleImage(image, [0.5, 1], 0.5)) // 设置图片
    this.vectorSource.addFeature(feature)

    return id
  }

  /**
   * @desc: 添加单点（最新）
   * @param {Number} id
   * @param {Array} latlng
   * @param {String} image
   * @param {Number} type
   * @param {Number} index
   * @param {Boolean} isEdit // 默认不可编辑
   */
  addSinglePoint (id, latlng, type = 1, index, image, isEdit = false, parentId = null, rend3d = false) {
    const feature = new OlFeature({
      id: id,
      latlng: latlng,
      type: type,
      index: index,
      isEdit: isEdit,
      parentId: parentId,
      rend3d: rend3d, // 静态feature可同步渲染3d，不用再创建entity
      geometry: new OlGeomPoint(fromLonLat(latlng))
    });
    if (type == 11) {
      let customStyle = { 'fillColor': 'rgba(255,165,0,1)', 'strokeColor': '#fff', 'strokeWidth': 2 } // 橙色
      feature.setStyle(setOlStylePoint(customStyle)) // 设置点样式
    } else {
      feature.setStyle(setOlStyleImage(image)) // 设置图片
    }
    this.feature = feature
    this.vectorSource.addFeature(feature)

    return id
  }
}

export {
  Point,
  Point3d
}
